
#include "I2C.h"

//------------------------------------------------------------------------------------------------------------
/*
bit I2CRead(BYTE addr, BYTE length, BYTE xdata *buf)   //registro,cant de bytes,destino
{
	BYTE i;
	I2CWaitForStop();	 				//espera que este libre
	I2CStartAndAddrW();	   				//envia START, la dirección del chip y el R/W = 0 (W)
	if(I2CWaitForAck())					//espera el reconocimiento
	  return(1);
	I2DAT = addr;						//envia la direccion del registro
	if(I2CWaitForAck())					//espera el reconocimiento
	  return(1);						
	I2CStartAndAddrR();	   				//envia START, la dirección del chip y el R/W = 1 (R)
	if(I2CWaitForDone())				//espera el reconocimiento
	  return(1);
	i = I2DAT;						    //lee basura ???
	if(I2CWaitForDone())				//espera el reconocimiento
	  return(1);	
	for (i=0; i < (length - 1); i++)	//almacena los datos pedidos
	{
	  *(buf+i) = I2DAT;
	  if(I2CWaitForDone())				//espera el reconocimiento de cada uno
	     return(1);
	}	
	I2CS = bmLASTRD;					
	if(I2CWaitForDone())				//espera el reconocimiento
	  return(1);	
	*(buf+i) = I2DAT;
	if(I2CWaitForDone())
	  return(1);	
	I2CS = bmSTOP;						//envia el STOP	
	i = I2DAT;
	return(0);
}*/
//------------------------------------------------------------------------------------------------------------
bit I2CWrite(BYTE addr, BYTE length, BYTE xdata *buf)	 //registro, cant de bytes, dato
{
	BYTE i;
	I2CWaitForStop();	 				//espera que este libre
	I2CStartAndAddrW();	   				//envia START, la dirección del chip y el R/W = 0 (W)
	if(I2CWaitForAck())					//espera el reconocimiento
	  return(1);
	I2DAT = addr;						//envia la direccion del registro
	if(I2CWaitForAck())					//espera el reconocimiento
	  return(1);
	
	for(i=0; i<length; i++)
	{
		I2DAT = buf[i];					//envia en dato a grabar
		if(I2CWaitForAck())				//espera el reconocimiento
	  		return(1);
	}

	I2CS = bmSTOP;						//envia el STOP	
	i = I2DAT;
	return(0);
}
//------------------------------------------------------------------------------------------------------------
void I2CWaitForStop()
{
   // Data should not be written to I2CS or I2DAT until the STOP bit returns low.
   while (I2CS & bmSTOP);
}
//------------------------------------------------------------------------------------------------------------
/*
void WaitForI2CWrite()
{
   I2CWaitForStop();
waitForBusy:
	I2CStartAndAddrW();

   I2CWaitForDone();
   I2CS |= bmSTOP;	//	; Set the STOP bit
   I2CWaitForStop();

   if (!(I2CS & bmACK))  // If no ACK, try again.
      goto waitForBusy;
} 

//------------------------------------------------------------------------------------------------------------
bit I2CWaitForDone()
{
   BYTE i;

   while (!((i = I2CS) & 1))  // Poll the done bit
      ;
   if (i & bmBERR)
      return 1;
   else
      return 0;
}
*/
//------------------------------------------------------------------------------------------------------------
bit I2CWaitForAck()
{
   BYTE i;

   while (!((i = I2CS) & 1))  // Poll the done bit
      ;
   if (i & bmBERR)
      return 1;
   else if (!(i & bmACK))
      return 1;
   else
      return 0;
}
//------------------------------------------------------------------------------------------------------------
void I2CStartAndAddrW(BYTE address_w)
{
	I2CS = bmSTART;
	I2DAT = address_w << 1;
}
//------------------------------------------------------------------------------------------------------------
/*
void I2CStartAndAddrR(BYTE address_r)
{
	I2CS = bmSTART;
	I2DAT = (address_r << 1) | 1;
}
*/
//------------------------------------------------------------------------------------------------------------

bit SetDAC5571(BYTE valor, BYTE modo)
{
	BYTE xdata buff[2];
	buff[0]=(0x30&(modo<<4))|((valor>>4)&0x0f);
	buff[1]=((valor<<4)&0xff);
	return I2CWrite(DAC5571_ADDRESS, 2, buff);	 //registro, cant de bytes, dato	
}